package com.cqw.commontest.random;

import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.Random;

/**
 * @Author: caoqingwen
 * @CreateTime: 2021-04-12 10:56
 * @Description:
 */
@Slf4j
public class RandomTest {


    public static void main(String[] args) {
        //Math.random
        double rd = Math.random();
        //rd的取值范围是[0.0,1.0),数据类型double    左闭右开
        //System.out.println(rd);

        int num = (int) (Math.random() * 3);
        //System.out.println(num);


        //使用种子为10的Random对象生成[0,20)的随机整数序列，每次序列都是相同的
        Random ran1 = new Random(10);
        for (int i = 0; i < 10; i++) {
            //System.out.println(ran1.nextInt(20));
        }

        //在没带参数构造方法生成的Random对象的种子默认是当前系统时间的毫秒数,每次序列都会不一样
        Random ran2 = new Random();
        for (int i = 0; i < 10; i++) {
            System.out.println(ran2.nextInt(20));
        }


        //另外。直接使用Random对象无法避免生成重复的数字，如果需要生成不重复的随机序列，需要借助数组和集合类
        getDiffNO(10);


        //相关方法


        Random random = new Random();
        //生成【0,1.0)之间的小数
        double double1 = random.nextDouble();
        //生成【0,5.0）之间的小数
        double double2 = random.nextDouble() * 5;
        //生成【1,2.5)之间的小数
        double double3 = random.nextDouble() * 1.5 + 1;
        //生成-321到231之间的整数
        int nextInt = random.nextInt();
        //生成【0,10）之间的整数
        int anInt = random.nextInt(10);

    }


    private static ArrayList getDiffNO(int n) {
        //生成 [0-n) 个不重复的随机数
        // list 用来保存这些随机数
        ArrayList<Object> list = new ArrayList<>();
        Random random = new Random();
        boolean[] bool = new boolean[n];
        int num = 0;

        for (int i = 0; i < n; i++) {
            do {
                num = random.nextInt(n);
            } while (bool[num]);
            bool[num] = true;
            list.add(num);
        }
        return list;

    }


}
